SwiftUIではFirebaseのスクリーンイベントが自動収集されない話
UIViewController
のスクリーンイベントは取得出来ているのにSwiftUI製の画面ではスクリーンイベントが取得出来ていなかった為、調べました。
環境
- Xcode 14.2
- Firebase Apple SDK 10.7.0
Firebaseのスクリーン自動追跡
Firebaseではスクリーンの遷移の追跡ができ、現在のスクリーンに関する情報がイベントに関連付けられるため、ユーザーエンゲージメントやスクリーンごとのユーザー行動などの指標を追跡できます。
スクリーンを自動的に追跡するの項目の中に、下記の記載があります。
アナリティクスは、現在フォーカスされている UIViewController または Activity のクラス名など、アプリケーション内のスクリーンに関する一部の情報を自動的に追跡します。
スクリーンの遷移が発生すると、新しいスクリーンを識別するscreen_viewイベントがロギングされます。こうしたスクリーンで発生するイベントには、firebase_screen_class パラメータ(例: menuViewController や MenuActivity など)と、生成されたfirebase_screen_idが自動的にタグ付けされます。
アプリで各スクリーンに異なる UIViewController または Activity を使用している場合は、すべてのスクリーンの遷移を自動的に追跡することが可能で、スクリーンごとに分類されたユーザーエンゲージメントのレポートが生成されます。アプリがそのように設定されていない場合でも、screen_viewイベントを手動でロギングすれば、このレポートを生成できます。
UIViewController または Activity を使用している場合は、すべてのスクリーンの遷移を自動的に追跡することが可能と書いてあり、また注意文として下記の記載があります。
SwiftUI アプリでは、FirebaseAnalyticsSwift モジュールを使用してロギングするビューのスクリーン名を手動で設定するか、手動でスクリーンビューをロギングする必要があります。
つまり、UIViewController
だとスクリーンの自動追跡は出来るけど、SwiftUIのViewに関しては自動追跡の対象外になります。
SwiftUIでスクリーンイベントを追跡する
FirebaseAnalyticsを使用する方法と、FirebaseAnalyticsSwiftを使用する例です。
FirebaseAnalytics
import FirebaseAnalytics struct ProfileView: View { var body: some View { Text("Profile") // onAppear時にスクリーンイベントのログを送信 .onAppear { Analytics.logEvent( AnalyticsEventScreenView, parameters: [ AnalyticsParameterScreenName: "profile", AnalyticsParameterScreenClass: String(describing: type(of: self)) ] ) } } }
FirebaseAnalyticsSwift
import FirebaseAnalyticsSwift struct ProfileView: View { var body: some View { Text("Profile") .analyticsScreen(name: "profile", class: String(describing: type(of: self))) } }
analyticsScreen
モディファイアを使用する方が記述がシンプルになり、SwiftUIっぽくてかっこいいですね。
補足
UIViewControllerRepresentable
を使用する場合では、UIViewController
が内包されているので自動収集されると思っていたのですが、結果としては、自動収集されていないケースと自動収集されているケースがありました。
どのような条件で自動収集されるかまではまだ調査できていませんが、UIViewControllerRepresentable
を使用する場合では手動でロギングをした方が確実で安心出来そうです。
おわりに
最近では、UIKitからSwiftUIへの移行のような話をよく耳にするようになりました。移行に際には、このスクリーンイベントもポイントとして押さえておきたいですね。 スクリーンイベントを自動で追跡しているプロジェクトでのSwiftUI移行の際にはお気をつけください。